#include "SDL.h" 
#include "Tela.h" 
#include "Jogador.h" 
#include "Inimigo.h" 
#include "Tiro.h" 
#include "Relogio.h" 
#include <list>

typedef list<Inimigo *> InimigosList;

int main( int argc, char* args[] ) { 
	
	bool quit = false;
	SDL_Event event;
	const int FRAMES_PER_SECOND = 30;
	int frame = 0;
	bool cap = true;
	Relogio fps;
	InimigosList inimigos;
	
	Jogador * jogador = new Jogador("dot.bmp", 20, 20, 0, 0, 0xFF, 0xFF, 0xFF); 
	Inimigo * inimigo = new Inimigo("dot.bmp", 20, 20, 800, 240, 0xFF, 0xFF, 0xFF);
	inimigos.push_back(inimigo); 
	inimigos.push_back(new Inimigo("dot.bmp", 20, 20, 600, 100, 0xFF, 0xFF, 0xFF));
	inimigos.push_back(new Inimigo("dot.bmp", 20, 20, 500, 150, 0xFF, 0xFF, 0xFF));
	inimigos.push_back(new Inimigo("dot.bmp", 20, 20, 300, 300, 0xFF, 0xFF, 0xFF));
	Tela tela(1000, 480, 32, SDL_SWSURFACE);

	SDL_Init( SDL_INIT_EVERYTHING ); 
	
	tela.initScreen();
	
	jogador->loadSpriteIntoSurface();
	
	tela.applyCoisaToTela(jogador);

	for (InimigosList::iterator ci = inimigos.begin(); ci != inimigos.end(); ++ci)
	{
		(*ci)->loadSpriteIntoSurface();
		tela.applyCoisaToTela(*ci);
	}
			
	tela.update();
	
	while( quit == false ) 
	{
		fps.start();
		while( SDL_PollEvent( &event ) ) 
		{
			switch(event.type)
			{
				case SDL_QUIT:
					quit = true; 
					break;
				case SDL_KEYDOWN:
					jogador->procKeyPressEvent(event);
					break;
				case SDL_KEYUP:
					jogador->procKeyLetGoEvent(event);
					break;
			}
		}
		tela.limpaTela();
		jogador->move(tela.getWidth(), tela.getHeight()); 
		tela.applyCoisaToTela(jogador);
		for (InimigosList::iterator ci = inimigos.begin(); ci != inimigos.end(); ci++)
		{	
			tela.applyCoisaToTela(*ci);
			(*ci)->updateTiros(jogador->getPosX(), jogador->getPosY());
			for(list<Tiro *>::iterator cj = (*ci)->tiros.begin(); cj != (*ci)->tiros.end(); cj++)
			{
				int y = (*ci)->getPosX();
				int x = (*cj)->destinoX;
				(*cj)->move(tela.getWidth(), tela.getHeight());
				if((*cj)->mustDelete)
					(*ci)->tiros.remove(*(cj++));
				else
					tela.applyCoisaToTela(*cj);
			}
		}
		
		tela.update();
		if(fps.get_ticks() < 1000 / FRAMES_PER_SECOND)  
		{ 
			/* Cada iteracao do while eh um frame. A cada segundo, renderizamos no maximo
			   FRAMES_PER_SECOND frames. Portanto cada frame deve rodar em 1 / FRAMES_PER_SECOND
			   segundos. Se a iteracao atual demorou menos de 1 / FRAMES_PER_SECOND segundos para rodar,
			   entao esperamos o tempo restante ateh dar 1 / FRAMES_PER_SECOND segundos */
			SDL_Delay((1000 / FRAMES_PER_SECOND) - fps.get_ticks()); 
		}
	}
	
	//Free the loaded image 
	jogador->freeSurface();
	//Quit SDL 
	SDL_Quit(); 
	
	return 0; 
}